package com.edgardeng.generator.service;

import com.edgardeng.generator.dataprovider.DataProviderManager;
import com.edgardeng.generator.dataprovider.jdbc.JdbcDataProvider;
import com.edgardeng.generator.entity.Column;
import com.edgardeng.generator.entity.ColumnEntity;
import com.edgardeng.generator.entity.SQLDataSource;
import com.edgardeng.generator.entity.Table;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Repository
public class DataProviderService {


    public List queryTables(SQLDataSource source) {
        String sql = source.sql4QueryTables();
        return queryDataSource(source, sql);
    }

    public Table  queryATables(SQLDataSource source, String table) {
        String sql = "select table_name , engine, table_comment , create_time  from information_schema.tables where table_schema = (select database()) and table_name = '" + table + "';";
        List<Map<String, String>> results = queryDataSource(source, sql);
        Map<String, String> map = results.get(0);
        return new Table(map.get("table_name"), map.get("table_comment"), map.get("create_time"));
    }

    public List<ColumnEntity> queryTableColumns(SQLDataSource source, String table) {
        String sql = source.sql4QueryColumns(table);
        List<HashMap<String,String>> maps = queryDataSource(source, sql);
        List<ColumnEntity> columsList = new ArrayList<>();
        for(HashMap<String, String> column : maps) {
            ColumnEntity columnEntity = new ColumnEntity();
            columnEntity.setName(column.get("column_name"));
            columnEntity.setType(column.get("data_type"));
            String comment = column.get("column_comment");
            if (comment == null) {
                comment = column.get("column_name");
            }
            columnEntity.setRemark(comment);
            columnEntity.setExtra(column.get("extra"));
            columnEntity.setIsKey(Integer.valueOf(column.get("isKey"))== 1);
            columsList.add(columnEntity);
        }
        return columsList;
    }


//    public List queryTableData(SQLDataSource source, String table) {
//        if ("xlscsv".contains(source.getType())) {
//            FileProvider fileProvider = FileProviderFactory.instance().datasource(source).build();
//            try {
//                return fileProvider.querySheetData(table);
//            }catch (IOException e) {
//                return null;
//            }
//        }
//        String sql = source.sql4QueryTableData(table,0,20);
//        return queryDataSource(source, sql);
//    }
//
//    public void updateDataSource(SQLDataSource SQLDataSource, String[] sql) {
//        try {
//            HashMap<String ,String> query = new HashMap<>();
//            query.put("sql","");
//            String type = SQLDataSource.getDriverType();
//            Map config = SQLDataSource.databaseConfig();
//            System.out.println(config);
//            JdbcDataProvider dataProvider = (JdbcDataProvider) DataProviderManager.getDataProvider(
//                    type, config, query, false);
//            dataProvider.updateSql(sql);
//            LOG.info("updateDataSource SQL:", sql.toString());
//        } catch (Exception e) {
//            LOG.error("", e);
//        }
//    }
//
    public List queryDataSource(SQLDataSource SQLDataSource, String sql) {
        try {
            HashMap<String ,String> query = new HashMap<>();
            query.put("sql",sql);
            String type = SQLDataSource.getDriverType();
            Map config = SQLDataSource.databaseConfig();
            JdbcDataProvider dataProvider = (JdbcDataProvider) DataProviderManager.getDataProvider(type, config, query, false);
            return dataProvider.querySql();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
//
//    // [][]  column & data
//    public List queryArrayData(SQLDataSource SQLDataSource, String table) {
//        try {
//            String sql = SQLDataSource.sql4QueryTableData(table,0,20);
//
//            HashMap<String ,String> query = new HashMap<>();
//            query.put("sql",sql);
//            String type = SQLDataSource.getDriverType();
//            Map config = SQLDataSource.databaseConfig();
//            JdbcDataProvider dataProvider = (JdbcDataProvider) DataProviderManager.getDataProvider(
//                    type, config, query, false);
//            return dataProvider.querySqlArrayData();
//        } catch (Exception e) {
//            LOG.error("", e);
//            return null;
//        }
//    }
//
//    /**
//     * all data for SQLDataSource table in dataset
//     * @param SQLDataSource
//     * @param table
//     * @param sql
//     * @return
//     */
//    public HashMap data4DataSet (SQLDataSource SQLDataSource, String table, String sql) {
//        // all
//        String columns = SQLDataSource.sql4QueryColumns(table);
//        List<HashMap<String,String>> cols = queryDataSource(SQLDataSource, columns);
//        String sql_all = "Select * FROM " + table;
//        List<HashMap<String,String>> data = queryDataSource(SQLDataSource, sql_all);
//        HashMap<String, List> result = new HashMap<>();
//        result.put("columns", cols);
//        result.put("data", data);
//        return result;
//    }


//    public boolean isDataSourceAggInstance(Long datasourceId, Map<String, String> query, Long datasetId) {
//        try {
//            Dataset dataset = getDataset(datasetId);
//            DataProvider dataProvider = getDataProvider(datasourceId, query, dataset);
//            return dataProvider.isDataSourceAggInstance();
//        } catch (Exception e) {
//            LOG.error("", e);
//            throw new CBoardException(e.getMessage());
//        }
//    }
//
//    private void attachCustom(Dataset dataset, AggregateConfig aggConfig) {
//        if (dataset == null || aggConfig == null) {
//            return;
//        }
//        Consumer<DimensionConfig> predicate = (config) -> {
//            if (StringUtils.isNotEmpty(config.getId())) {
//                String custom = (String) JSONPath.eval(dataset.getSchema(), "$.dimension[id='" + config.getId() + "'][0].custom");
//                if (custom == null) {
//                    custom = (String) JSONPath.eval(dataset.getSchema(), "$.dimension[type='level'].columns[id='" + config.getId() + "'][0].custom");
//                }
//                config.setCustom(custom);
//            }
//        };
//        aggConfig.getRows().forEach(predicate);
//        aggConfig.getColumns().forEach(predicate);
//    }

//    protected Dataset getDataset(Long datasetId) {
//        if (datasetId == null) {
//            return null;
//        }
//        return new Dataset(datasetDao.getDataset(datasetId));
//    }
}
